//
//  SQL.h
//  SQL演练
//
//  Created by Guo Rui on 2017/10/27.
//  Copyright © 2017年 GR Harry. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#ifdef DEBUG
#define SQLLog(format, ...) NSLog((@"\n" format @"\n"), ##__VA_ARGS__);
#else
#define SQLLog(format, ...)
#endif


@class SQLChain;
typedef SQLChain* (^SQLChainNoParamBlock)(void);
typedef SQLChain* (^SQLChainStringParamBlock)(NSString *);
typedef SQLChain* (^SQLChainArrayParamBlock)(NSArray *);
typedef SQLChain* (^SQLChainDoubleArrayParamBlock)(NSArray *, NSArray *);
typedef SQLChain* (^SQLChainDoubleIntParamBlock)(NSInteger param1, NSInteger param2);
typedef SQLChain* (^SQLChainDoubleStringParamBlock)(NSString *str1, NSString *str2);

typedef SQLChain* (^SQLChainInsertParamBlock)(NSString *tableName, NSArray *fields, NSArray *values);
typedef SQLChain* (^SQLChainUpdateParamBlock)(NSString *tableName, NSArray *fields, NSArray *values);

@interface SQLChain : NSObject

- (NSString *)sqlString;

- (void)reset;

/************************************************** DDL ***************************************************/

/**
 @brief str :表名
 */
- (SQLChainStringParamBlock)createTable;

/**
 @brief str :表名
 */
- (SQLChainStringParamBlock)dropTable;

/**
 @brief str1 :旧表名 str2 :新表名
 */
- (SQLChainDoubleStringParamBlock)renameTable;

/**
 @brief str1 :表名 str2 :字段名 类型 约束. eg: t_student, address TEXT
 */
- (SQLChainDoubleStringParamBlock)addcolumn;

/**
 @brief str :字段声明语句. eg: score REAL DEFAULT 60
 */
- (SQLChainStringParamBlock)fieldsDefine;

/************************************************** DML ***************************************************/

/**
 @brief str :表名
 */
- (SQLChainStringParamBlock)insert;

/**
 @brief tableName :表名 fields :字段名 values : 值
 */
- (SQLChainInsertParamBlock)insert_into;

/**
 @brief str :表名
 */
- (SQLChainStringParamBlock)update;

/**
 @brief tableName :表名 fields :字段名 values : 值
 */
- (SQLChainUpdateParamBlock)update_set;

/**
 @brief str :表名
 */
- (SQLChainStringParamBlock)del;

/************************************************** DQL ***************************************************/

/**
 @brief str :字段1 ,字段2..
 */
- (SQLChainArrayParamBlock)select;

/**
 @brief 选择所有的记录
 */
- (SQLChainNoParamBlock)selectAll;

/************************************************** 条件语句 ***************************************************/

/**
 @brief str :条件语句. eg: name = 'Jack', id = @1
 */
- (SQLChainStringParamBlock)where;

/************************************************** 排序语句 ***************************************************/

/**
 @brief str :排序语句. eg: score ASC, age DESC
 */
- (SQLChainStringParamBlock)orderby;

/************************************************** 分页语句 ***************************************************/

// param1 : 表示跳过多少条数据。 param2 : 表示取出多少条数据。
- (SQLChainDoubleIntParamBlock)limit;

/************************************************** 连接符 ***************************************************/

/**
 @brief str :(字段1 ,字段2..)
 */
- (SQLChainArrayParamBlock)fields;

/**
 @brief str :(值1 ,值2..)
 */
- (SQLChainArrayParamBlock)values;

/**
 @brief str :表名
 */
- (SQLChainStringParamBlock)from;

/**
 @brief str :字段1 = 值1，字段2 = 值2..
 */
- (SQLChainDoubleArrayParamBlock)set;

/**
 结尾符，用于添加逗号。
 */
- (SQLChainNoParamBlock)end;

/************************************************** Debug ***************************************************/
- (SQLChainNoParamBlock)output;
@end
